/**
 * Directorio.h
 *
 *  Created on: 24/12/2009
 *      Author: San Martín, Matías I.
 */

#ifndef DIRECTORIO_H_
#define DIRECTORIO_H_

#include <list>

#include "DirectorioRPC.h"

#include "../Modelo/Common/InformacionPlaneta.h"
#include "../Modelo/Common/JuegoDTO.h"
#include "../Modelo/Common/JugadorDTO.h"
#include "../Modelo/EnJugador/Universo.h"

#include "../Common/InformacionCreacionUniverso.h"

using aplicacion::jugador::Universo;

namespace aplicacion {

//--------------------- DEFINICIÓN DE TIPOS -----------------------------

typedef std::list<InformacionCreacionUniverso> t_listaUniversos;
typedef std::list<JuegoDTO> t_listaJuegos;
typedef std::list<InformacionPlaneta> t_listaPlanetas;

/**
 * Define la interfaz del Directorio donde se registran los componentes
 * de la aplicación.
 */
class Directorio {
//------------------------------ CONSTANTES ------------------------------
public:

//------------------------------ ATRIBUTOS ------------------------------
private:


//------------------------------ METODOS ------------------------------
public:

	/**
	 * Permite registrar al universo indicado.
	 * La información de las características del universo a crear están
	 * indicadas en la instancia indicada.
	 *
	 * @param aRegistrar universo a registrar (contiene las características
	 * 			que lo definen)
	 *
	 * Al retorno aRegistrar se actualiza con el id del universo registrado
	 *
	 * @return True si se pudo registrar el universo
	 *
	 * TODO DEFINIR LOGUEO QUE INDICA PQ NO SE PUDO REGISTRAR
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool registrarNuevo (InformacionCreacionUniverso& aRegistrar) = 0;

	/**
	 * Permite registrar al juego indicado.
	 * La información de las características del juego a crear están
	 * indicadas en la instancia indicada.
	 *
	 * @param aRegistrar juego a registrar (contiene las características
	 * 			que lo definen)
	 *
	 * @return Puntero a misma instancia que la del parámetro (mismo puntero)
	 * 			a la cual se le actualiza la información de identificador
	 * 			del juego a la que se usará en el sistema o
	 * 			NULL si no se pudo registrar el juego.
	 *
	 * TODO DEFINIR LOGUEO QUE INDICA PQ NO SE PUDO REGISTRAR
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool registrarNuevo (JuegoDTO& aRegistrar) = 0;

	/**
	 * Permite agregar un planeta a un universo existente.
	 * La información de las características del planeta a agregar están
	 * indicadas en la instancia indicada.
	 *
	 * @param universo Universo al que se quiere agregar el planeta
	 * 					(debe contener un identificador de universo válido
	 * 					obtenido al registrarNuevo universo)
	 * @param aAgregar planeta a agregar (contiene las características
	 * 					que lo definen)
	 *
	 * @return Puntero a misma instancia que la del parámetro (mismo puntero)
	 * 			a la cual se le actualiza la información de identificador
	 * 			del planeta a la que se usará en el sistema o
	 * 			NULL si no se pudo registrar el planeta.
	 *
	 * TODO DEFINIR LOGUEO QUE INDICA PQ NO SE PUDO REGISTRAR
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool add (const InformacionCreacionUniverso& universo, InformacionPlaneta& aAgregar) = 0;

	/**
	 * Permite agregar un jugador a un juego existente.
	 * La información de las características del jugador a agregar están
	 * indicadas en la instancia indicada.
	 *
	 * @param juego Juego al que se quiere agregar el jugador
	 * 					(debe contener un identificador de juego válido
	 * 					obtenido al registrarNuevo juego)
	 * @param aAgregar jugador a agregar (contiene las características
	 * 					que lo definen)
	 *
	 * @return Puntero a misma instancia que la del parámetro (mismo puntero)
	 * 			a la cual se le actualiza la información de identificador
	 * 			del jugador a la que se usará en el sistema o
	 * 			NULL si no se pudo registrar el jugador.
	 *
	 * TODO DEFINIR LOGUEO QUE INDICA PQ NO SE PUDO REGISTRAR
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool add (const JuegoDTO& juego, JugadorDTO& aAgregar) = 0;

	virtual bool remove(const JugadorDTO& aQuitar) = 0;

	/**
	 * Permite a un jugador indicar que esta dispuesto o no a empezar un juego
	 * al que pertenece.
	 *
	 * @param juego juego que se está dispuesto a empezar.
	 * 					(debe contener un identificador de juego válido
	 * 					obtenido al registrarNuevo juego)
	 * @param jugador jugador que realiza la acción (debe contener un identificador
	 * 					de jugador válido obtenido al agregarlo -add- al juego)
	 * @param dispuesto true si el jugador esta dispuesto a empezar el juego
	 * 					false si no esta dispuesto
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool esperarComienzo(const JugadorDTO& jugador) = 0;

	/**
	 * Permite consultar por universos registrados, a los cuales se pueden
	 * suscribir planetas.
	 *
	 * @return lista de universos registrados.
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual t_listaUniversos listarUniversosAbiertos() = 0;

	/**
	 * Permite consultar por universos registrados, listos para albergar
	 * un juego.
	 *
	 * @return lista de universos registrados.
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual t_listaUniversos listarUniversosCerrados() = 0;

	/**
	 * Permite consultar por juegos registrados, a los cuales se pueden
	 * inscribir jugadores.
	 *
	 * @return lista de juegos registrados.
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual t_listaJuegos listarJuegosAbiertos() = 0;

	/**
	 * Permite eliminar un juego del directorio.
	 *
	 * @return true si pudo eliminar el juego.
	 *
	 * TODO DEFINIR EXCEPCIONES POSIBLES EN CASO DE QUE FALLE POR ALGUN MOTIVO
	 * 		EXCEPCIONAL
	 */
	virtual bool destruirJuego(const JuegoDTO& juego) = 0;

	/**
	 * Permite obtener la información del planeta indicado.
	 *
	 * @param  idPlaneta puntero a información de planeta donde se cargará la
	 * 			información obtenida. Este debe contener el identificador del
	 * 			planeta a buscar. NOTA: solo carga el tamaño y la posición del
	 * 			planeta.
	 *
	 * @return Puntero a misma instancia que la del parámetro (mismo puntero)
	 * 			a la cual se le actualiza la información del planeta
	 */
	virtual InformacionPlaneta*
				getInformacionPlaneta(InformacionPlaneta* infoPlaneta) = 0;

	/**
	 * Permite obtener la dirección de middleware de un planeta.
	 * NOTA: no usar esta función directamente, sino a través de
	 * Middleware::Comunicaciones::TraductorDirecciones que implementa
	 * un cachè de direcciones.
	 *
	 * @param  idPlaneta es el id del planeta del cual se quiere obtener
	 * 			la dirección
	 *
	 * @return la dirección del planeta, o DIR_INVALIDA si no se encontró.
	 */
	virtual Direccion getDireccionPlaneta(IdPlaneta idPlaneta) = 0;

	/**
	 * Devuelve el listado de los planetas que componen el universo con id
	 * idUniverso. Completa los campos id, posición y tamaño con los datos
	 * reales, mientras que el campo idDuenio recibe el valor
	 * IdJugador::ID_UNDEFINED y el campo cantidadNaves recibe el valor cero.
	 */
	virtual t_listaPlanetas listarPlanetas(IdUniverso idUniverso) = 0;

	virtual operator bool() const = 0;

private:
};

}  // namespace aplicacion

#endif /* DIRECTORIO_H_ */
